package cn.dengta.webapp.trade.entity.meta;

import cn.dengta.webapp.trade.entity.meta.MetaConfig.MetaRuleConfig;
import lombok.Getter;
import lombok.Setter;
import me.codeplayer.util.Assert;

/**
 * 牵线的规则配置对象
 */
@Getter
@Setter
public class PullWiresRule implements MetaRuleConfig {

	public MalePullWiresEntry male;

	@Override
	public void validate() {
		Assert.isTrue(male != null, "男用户牵线配置不能为空！");
		male.validate();
	}

	@Override
	public void init(MetaRuleConfig config) {
		PullWiresRule rule = (PullWiresRule) config;
		this.male = rule.male;
	}

	/**
	 * 男用户牵线规则实体
	 */
	@Setter
	@Getter
	public static class MalePullWiresEntry {

		/** 当天首次启动（/登录）获得推荐值 */
		protected int firstOpen;
		/** 当天非首次启动（/登录）获得推荐值 */
		protected int open;
		/** 限制频率间隔（分） */
		protected int limitInterval;
		/** 限制频率间隔内最大牵线次数 */
		protected int limitTimes;
		/** 离线超时时间（分）：离线指定分钟后停止牵线 */
		protected int offlineTimeout;
		/** 在线时间（分）：在线每满该分钟数，就增加特定推荐值 */
		protected int onlineCycle;
		/** 牵线限制总次数 */
		protected int limitMaxTimesEveryday;
		/** 牵线消息窗口大小 */
		protected int msgWindowSize;
		/** 近N条牵线消息，如未回复过，则追加指定牵线值 */
		protected int noReplyPoint;
		/** 最近N条牵线消息，如回复过，则追加指定牵线值 */
		protected int replyPoint;

		public void validate() {
			Assert.isTrue(firstOpen >= 0, "首次启动获得推荐值不能小于0！");
			Assert.isTrue(open >= 0, "非首次启动获得推荐值不能小于0！");
			Assert.isTrue(limitInterval > 0, "频率间隔必须大于0！");
			Assert.isTrue(limitTimes > 0, "频率间隔牵线限制必须大于0！");
			Assert.isTrue(offlineTimeout >= 0, "离线延迟时间不能小于0！");
			Assert.isTrue(onlineCycle > 0, "在线时长必须大于0！");
			Assert.isTrue(limitMaxTimesEveryday >= 0, "牵线总次数不能小于0！");
			Assert.isTrue(msgWindowSize > 0, "最近牵线消息条数必须大于0！");
			Assert.isTrue(noReplyPoint >= 0, "最近牵线消息未回复增加推荐值不能小于0！");
			Assert.isTrue(replyPoint >= 0, "最近牵线消息回复增加推荐值不能小于0！");
		}

		public int getPoint(boolean reply) {
			return reply ? replyPoint : noReplyPoint;
		}

	}

}
